#include <stdint.h>

#include "stm32f10x.h"

#define LED_Clock RCC_APB2Periph_GPIOC
#define LED_Port  GPIOC
#define LED_Pin   GPIO_Pin_13

void delay();
void GPIO_Toggle(GPIO_TypeDef *port, uint16_t pin);

int main()
{
    RCC_APB2PeriphClockCmd(LED_Clock, ENABLE);

    auto led_init = (GPIO_InitTypeDef){
        .GPIO_Pin   = LED_Pin,
        .GPIO_Speed = GPIO_Speed_50MHz,
        .GPIO_Mode  = GPIO_Mode_Out_PP,
    };
    GPIO_Init(LED_Port, &led_init);

    while (true) {
        GPIO_Toggle(LED_Port, LED_Pin);
        delay();
    }
}

void delay()
{
    const auto timeout = 1e5;

    for (auto i = 0; i < timeout; i++) {
        __NOP();
    }
}

void GPIO_Toggle(GPIO_TypeDef *port, uint16_t pin)
{
    port->ODR ^= pin;
}
